/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controlador;

import controlador.exceptions.IllegalOrphanException;
import controlador.exceptions.NonexistentEntityException;
import controlador.exceptions.PreexistingEntityException;
import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.transaction.UserTransaction;
import modelo.ClientePropietarioObra;
import modelo.ClientePropietarioObraPK;
import modelo.Obra;
import modelo.Cliente;
import modelo.SubastaPropia;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author eltorre
 */
public class ClientePropietarioObraJpaController implements Serializable {

    public ClientePropietarioObraJpaController(UserTransaction utx, EntityManagerFactory emf) {
        this.utx = utx;
        this.emf = emf;
    }
    private UserTransaction utx = null;
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(ClientePropietarioObra clientePropietarioObra) throws PreexistingEntityException, Exception {
        if (clientePropietarioObra.getClientePropietarioObraPK() == null) {
            clientePropietarioObra.setClientePropietarioObraPK(new ClientePropietarioObraPK());
        }
        if (clientePropietarioObra.getSubastaPropiaList() == null) {
            clientePropietarioObra.setSubastaPropiaList(new ArrayList<SubastaPropia>());
        }
        clientePropietarioObra.getClientePropietarioObraPK().setObra(clientePropietarioObra.getObra1().getId());
        clientePropietarioObra.getClientePropietarioObraPK().setCliente(clientePropietarioObra.getCliente1().getId());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Obra obra1 = clientePropietarioObra.getObra1();
            if (obra1 != null) {
                obra1 = em.getReference(obra1.getClass(), obra1.getId());
                clientePropietarioObra.setObra1(obra1);
            }
            Cliente cliente1 = clientePropietarioObra.getCliente1();
            if (cliente1 != null) {
                cliente1 = em.getReference(cliente1.getClass(), cliente1.getId());
                clientePropietarioObra.setCliente1(cliente1);
            }
            List<SubastaPropia> attachedSubastaPropiaList = new ArrayList<SubastaPropia>();
            for (SubastaPropia subastaPropiaListSubastaPropiaToAttach : clientePropietarioObra.getSubastaPropiaList()) {
                subastaPropiaListSubastaPropiaToAttach = em.getReference(subastaPropiaListSubastaPropiaToAttach.getClass(), subastaPropiaListSubastaPropiaToAttach.getId());
                attachedSubastaPropiaList.add(subastaPropiaListSubastaPropiaToAttach);
            }
            clientePropietarioObra.setSubastaPropiaList(attachedSubastaPropiaList);
            em.persist(clientePropietarioObra);
            if (obra1 != null) {
                obra1.getClientePropietarioObraList().add(clientePropietarioObra);
                obra1 = em.merge(obra1);
            }
            if (cliente1 != null) {
                cliente1.getClientePropietarioObraList().add(clientePropietarioObra);
                cliente1 = em.merge(cliente1);
            }
            for (SubastaPropia subastaPropiaListSubastaPropia : clientePropietarioObra.getSubastaPropiaList()) {
                ClientePropietarioObra oldClientePropietarioObraOfSubastaPropiaListSubastaPropia = subastaPropiaListSubastaPropia.getClientePropietarioObra();
                subastaPropiaListSubastaPropia.setClientePropietarioObra(clientePropietarioObra);
                subastaPropiaListSubastaPropia = em.merge(subastaPropiaListSubastaPropia);
                if (oldClientePropietarioObraOfSubastaPropiaListSubastaPropia != null) {
                    oldClientePropietarioObraOfSubastaPropiaListSubastaPropia.getSubastaPropiaList().remove(subastaPropiaListSubastaPropia);
                    oldClientePropietarioObraOfSubastaPropiaListSubastaPropia = em.merge(oldClientePropietarioObraOfSubastaPropiaListSubastaPropia);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findClientePropietarioObra(clientePropietarioObra.getClientePropietarioObraPK()) != null) {
                throw new PreexistingEntityException("ClientePropietarioObra " + clientePropietarioObra + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(ClientePropietarioObra clientePropietarioObra) throws IllegalOrphanException, NonexistentEntityException, Exception {
        clientePropietarioObra.getClientePropietarioObraPK().setObra(clientePropietarioObra.getObra1().getId());
        clientePropietarioObra.getClientePropietarioObraPK().setCliente(clientePropietarioObra.getCliente1().getId());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            ClientePropietarioObra persistentClientePropietarioObra = em.find(ClientePropietarioObra.class, clientePropietarioObra.getClientePropietarioObraPK());
            Obra obra1Old = persistentClientePropietarioObra.getObra1();
            Obra obra1New = clientePropietarioObra.getObra1();
            Cliente cliente1Old = persistentClientePropietarioObra.getCliente1();
            Cliente cliente1New = clientePropietarioObra.getCliente1();
            List<SubastaPropia> subastaPropiaListOld = persistentClientePropietarioObra.getSubastaPropiaList();
            List<SubastaPropia> subastaPropiaListNew = clientePropietarioObra.getSubastaPropiaList();
            List<String> illegalOrphanMessages = null;
            for (SubastaPropia subastaPropiaListOldSubastaPropia : subastaPropiaListOld) {
                if (!subastaPropiaListNew.contains(subastaPropiaListOldSubastaPropia)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain SubastaPropia " + subastaPropiaListOldSubastaPropia + " since its clientePropietarioObra field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (obra1New != null) {
                obra1New = em.getReference(obra1New.getClass(), obra1New.getId());
                clientePropietarioObra.setObra1(obra1New);
            }
            if (cliente1New != null) {
                cliente1New = em.getReference(cliente1New.getClass(), cliente1New.getId());
                clientePropietarioObra.setCliente1(cliente1New);
            }
            List<SubastaPropia> attachedSubastaPropiaListNew = new ArrayList<SubastaPropia>();
            for (SubastaPropia subastaPropiaListNewSubastaPropiaToAttach : subastaPropiaListNew) {
                subastaPropiaListNewSubastaPropiaToAttach = em.getReference(subastaPropiaListNewSubastaPropiaToAttach.getClass(), subastaPropiaListNewSubastaPropiaToAttach.getId());
                attachedSubastaPropiaListNew.add(subastaPropiaListNewSubastaPropiaToAttach);
            }
            subastaPropiaListNew = attachedSubastaPropiaListNew;
            clientePropietarioObra.setSubastaPropiaList(subastaPropiaListNew);
            clientePropietarioObra = em.merge(clientePropietarioObra);
            if (obra1Old != null && !obra1Old.equals(obra1New)) {
                obra1Old.getClientePropietarioObraList().remove(clientePropietarioObra);
                obra1Old = em.merge(obra1Old);
            }
            if (obra1New != null && !obra1New.equals(obra1Old)) {
                obra1New.getClientePropietarioObraList().add(clientePropietarioObra);
                obra1New = em.merge(obra1New);
            }
            if (cliente1Old != null && !cliente1Old.equals(cliente1New)) {
                cliente1Old.getClientePropietarioObraList().remove(clientePropietarioObra);
                cliente1Old = em.merge(cliente1Old);
            }
            if (cliente1New != null && !cliente1New.equals(cliente1Old)) {
                cliente1New.getClientePropietarioObraList().add(clientePropietarioObra);
                cliente1New = em.merge(cliente1New);
            }
            for (SubastaPropia subastaPropiaListNewSubastaPropia : subastaPropiaListNew) {
                if (!subastaPropiaListOld.contains(subastaPropiaListNewSubastaPropia)) {
                    ClientePropietarioObra oldClientePropietarioObraOfSubastaPropiaListNewSubastaPropia = subastaPropiaListNewSubastaPropia.getClientePropietarioObra();
                    subastaPropiaListNewSubastaPropia.setClientePropietarioObra(clientePropietarioObra);
                    subastaPropiaListNewSubastaPropia = em.merge(subastaPropiaListNewSubastaPropia);
                    if (oldClientePropietarioObraOfSubastaPropiaListNewSubastaPropia != null && !oldClientePropietarioObraOfSubastaPropiaListNewSubastaPropia.equals(clientePropietarioObra)) {
                        oldClientePropietarioObraOfSubastaPropiaListNewSubastaPropia.getSubastaPropiaList().remove(subastaPropiaListNewSubastaPropia);
                        oldClientePropietarioObraOfSubastaPropiaListNewSubastaPropia = em.merge(oldClientePropietarioObraOfSubastaPropiaListNewSubastaPropia);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                ClientePropietarioObraPK id = clientePropietarioObra.getClientePropietarioObraPK();
                if (findClientePropietarioObra(id) == null) {
                    throw new NonexistentEntityException("The clientePropietarioObra with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(ClientePropietarioObraPK id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            ClientePropietarioObra clientePropietarioObra;
            try {
                clientePropietarioObra = em.getReference(ClientePropietarioObra.class, id);
                clientePropietarioObra.getClientePropietarioObraPK();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The clientePropietarioObra with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<SubastaPropia> subastaPropiaListOrphanCheck = clientePropietarioObra.getSubastaPropiaList();
            for (SubastaPropia subastaPropiaListOrphanCheckSubastaPropia : subastaPropiaListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This ClientePropietarioObra (" + clientePropietarioObra + ") cannot be destroyed since the SubastaPropia " + subastaPropiaListOrphanCheckSubastaPropia + " in its subastaPropiaList field has a non-nullable clientePropietarioObra field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Obra obra1 = clientePropietarioObra.getObra1();
            if (obra1 != null) {
                obra1.getClientePropietarioObraList().remove(clientePropietarioObra);
                obra1 = em.merge(obra1);
            }
            Cliente cliente1 = clientePropietarioObra.getCliente1();
            if (cliente1 != null) {
                cliente1.getClientePropietarioObraList().remove(clientePropietarioObra);
                cliente1 = em.merge(cliente1);
            }
            em.remove(clientePropietarioObra);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<ClientePropietarioObra> findClientePropietarioObraEntities() {
        return findClientePropietarioObraEntities(true, -1, -1);
    }

    public List<ClientePropietarioObra> findClientePropietarioObraEntities(int maxResults, int firstResult) {
        return findClientePropietarioObraEntities(false, maxResults, firstResult);
    }

    private List<ClientePropietarioObra> findClientePropietarioObraEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from ClientePropietarioObra as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public ClientePropietarioObra findClientePropietarioObra(ClientePropietarioObraPK id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(ClientePropietarioObra.class, id);
        } finally {
            em.close();
        }
    }

    public int getClientePropietarioObraCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from ClientePropietarioObra as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
